package com.tonghl.juc.container_study.code;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;


/**
 * Created by tonghl
 *   集合类不安全的问题
 */
public class ContainerNoSafeDemo {

    public static void main(String[] args) {
        /*List<String> list=new ArrayList<>();
        for (int i = 1; i <=30 ; i++) {
            list.add(UUID.randomUUID().toString().substring(0,8));
            System.out.println(list);
            new Thread(()->{},String.valueOf(i)).start();

        }*/

        //List<String> list= Collections.synchronizedList(new ArrayList<>());
        // List<String> list = new CopyOnWriteArrayList<>();

        //java.util.ConcurrentModificationException 并发修改异常



        new HashSet<>().add("a");
        /**
         * 1 故障现象 java.util.ConcurrentModificationException
         *
         * 2 导致的原因
         *
         * 3 解决方案
         *
         *      3.1 new Vector（）；
         *      3.2 List<String> list= Collections.synchronizedList(new ArrayList<>());
         *      3.3 new CopyOnWriteArrayList<>();
         *
         *
         * 4 优化建议
         */

    }
}

/**
 * 本节笔记：
 * 写时复制
 * CopyOnWrite容器即写时复制的容器。往一个容器添加元素的时候，不直接往当前容器Object[]添加，而是先将当前容器Object【】进行Copy
 * 复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素，添加元素之后，
 * 在将原容器的引用指向新的容器 setArray（newElements）；。这样做的好处是可以对CopyOnWrite容器进行并发的度，
 * 而不需要加锁，因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想，读和写不同的容器
 *
 *     public boolean add(E e) {
 *         final ReentrantLock lock = this.lock;
 *         lock.lock();
 *         try {
 *             Object[] elements = getArray();
 *             int len = elements.length;
 *             Object[] newElements = Arrays.copyOf(elements, len + 1);
 *             newElements[len] = e;
 *             setArray(newElements);
 *             return true;
 *         } finally {
 *             lock.unlock();
 *         }
 *     }
 *
 */